# 1、类的成员--属性
# 1-1、类属性
class Car:
    wheel=4 #类属性
    def driver(self):
        print('能跑')

# 通过类调用 类属性
print(Car.wheel)

# 只能通过类修改 类属性
Car.wheel=6
print(Car.wheel)

# 通过对象调用 类属性
car=Car()
print(car.wheel)
car.driver()

# 1-2实例属性
class Cat:
    legs=4
    def __init__(self,color):
        self.color=color
    def skill(self):
        print('抓老鼠')
cat1=Cat('black')
print(cat1.color)
cat1.skill()

# 通过对象修改 实例属性
cat1.color='grey'
print(cat1.color)

# 动态的给实例属性赋值
cat1.eyes='blue'
print(cat1.eyes)

# 2、类的方法：
# 实例方法：
class Car:
    wheel=4
    def driver(self,how):
        print(f'能{how}跑')
car=Car()
car.driver('飞快的')

# 类方法：
class Car:
    wheel=4
    def driver(self,how):
        print(f'能{how}跑')
    @classmethod
    def test1(cls):
        print('我是一个类方法')
Car.test1()
car=Car()
car.test1()

# 静态方法：
class Car:
    wheel=4
    def driver(self,how):
        print(f'能{how}跑')
    @classmethod
    def test1(cls):
        print('我是一个类方法')
    @staticmethod
    def test2():
        print('我是一个静态方法')
Car.test2()


# 3、构造方法
# 无参构造方法：
class Cat:
    def __init__(self):
        self.eyes='black'
        self.legs=4
        self.tail=1
    def skill(self):
        print('抓老鼠')
cat1=Cat()
print(cat1.eyes)
cat1.skill()

# 有参构造方法：
class Cat:
    def __init__(self,eyes,color):
        self.eyes=eyes
        self.legs=4
        self.tail=1
        self.color=color
    def skill(self):
        print('抓老鼠')
cat1=Cat('black','blue')
print(cat1.legs)
cat1.skill()

# 4、析构方法：
class Cat:
    def __init__(self,eyes,color):
        self.eyes=eyes
        self.legs=4
        self.tail=1
        self.color=color

    def skill(self):
        print('抓老鼠')
    def __del__(self):
        print('猫对象已销毁')
cat1=Cat('black','blue')
print(cat1.legs)
cat1.skill()


# 5、私有成员
print('-----------------------')
class Cat:
    legs=4
    eyes=2
    def __init__(self,mew,color):
        self.__mew=mew
        self.color=color
    def func1(self):
        print(f"猫的叫声是{self.__mew}的")
    def __func2(self):
        print(f"走路静悄悄的")
    def func3(self):
        self.__func2()
        print(f'很好看')
cat1=Cat('甜甜','blue')
print(cat1.color)
cat1.func1()
cat1.func3()


'''
----封装案例：学生类----
编写一个学生类：
属性：姓名、性别、类别默认为people
方法：hello
封装属性：年龄
增加方法：显示年龄、设置年龄
'''
print('------------------------')
class Student:
    category='people'
    def __init__(self,name,sex,age):
        self.name=name
        self.sex=sex
        self.__age=age
    def hello(self):
        print(f"大家好，我叫{self.name}")
    # def func1(self):
    #     print(f"{self.name}的年龄是{self.__age}")
    def set_age(self,age):
        if age>=0 and age<=200:
            self.__age=age
    def get_age(self):
        if self.sex!='女':
            return self.__age
        else:
            return '保密'
student1=Student('zhangsan','女',18)
print(student1.get_age())


